#include "vec3.h"
#include "math.h"

Vec3::Vec3() : x(0.0f), y(0.0f), z(0.0f)
{

}

Vec3::Vec3( float x, float y, float z )
{
	this->x = x;
	this->y = y;
	this->z = z;
}

void Vec3::operator+=( const Vec3& rhs )
{
	x += rhs.x;
	y += rhs.y;
	z += rhs.z;
}

Vec3 operator+(const Vec3& v1, const Vec3& v2)
{
	return Vec3(v1.x + v2.x, v1.y + v2.y, v1.z + v2.z);
}

Vec3 operator-(const Vec3& v1, const Vec3& v2)
{
	return Vec3(v1.x - v2.x, v1.y - v2.y, v1.z - v2.z);
}

Vec3 operator*(const Vec3& vec, float scalar)
{
	return Vec3(vec.x*scalar, vec.y*scalar, vec.z*scalar);
}

Vec3 operator/(const Vec3& vec, float scalar)
{
	return Vec3(vec.x/scalar, vec.y/scalar, vec.z/scalar);
}

float vecLength( const Vec3& vec )
{
	return (float)sqrt(vecDotProduct(vec, vec));
}

Vec3 vecUnitVector( const Vec3& vec )
{
	float length = vecLength(vec);
	return vec/length;
}

float vecDotProduct( const Vec3& v1, const Vec3& v2 )
{
	return v1.x*v2.x + v1.y*v2.y + v1.z*v2.z;
}

Vec3 vecCrossProduct( const Vec3& v1, const Vec3& v2 )
{
	float a = v1.y*v2.z - v1.z*v2.y;
	float b = v1.z*v2.x - v1.x*v2.z;
	float c = v1.x*v2.y - v1.y*v2.x;

	return Vec3(a, b, c);
}
